<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui"
    />
    <title>Android打渠道包方案总结 | zzqhost</title>
    <meta name="description" content="天行健，君子以自强不息；地势坤，君子以厚德载物" />
    <meta property="og:type" content="website" />
    <meta property="og:title" content="Android打渠道包方案总结 | zzqhost" />
    <meta property="og:site_name" content="Android打渠道包方案总结 | zzqhost" />
    <meta property="og:locale" content="zh-CN" />
    <meta name="twitter:card" content="summary" />
    <meta name="twitter:title" content="Android打渠道包方案总结 | zzqhost" />
    <link rel="shortcut icon" href="/favicon.ico">
    
    <link rel="preload" href="/assets/css/0.styles.948dbb0a.css" as="style"><link rel="preload" href="/assets/js/app.3e01f5cb.js" as="script"><link rel="preload" href="/assets/js/1.21aaee9f.js" as="script"><link rel="preload" href="/assets/js/14.98a4de9c.js" as="script"><link rel="preload" href="/assets/js/5.352c1a43.js" as="script"><link rel="preload" href="/assets/js/7.4a8a313c.js" as="script"><link rel="preload" href="/assets/js/9.5ce2172b.js" as="script"><link rel="preload" href="/assets/js/6.8b8fad13.js" as="script"><link rel="preload" href="/assets/js/23.1e2b813e.js" as="script"><link rel="preload" href="/assets/js/13.186562af.js" as="script"><link rel="preload" href="/assets/js/15.740f4afc.js" as="script"><link rel="prefetch" href="/assets/js/10.e3f309c4.js"><link rel="prefetch" href="/assets/js/11.7bef5ef0.js"><link rel="prefetch" href="/assets/js/12.cf546b2f.js"><link rel="prefetch" href="/assets/js/16.c0f3e779.js"><link rel="prefetch" href="/assets/js/17.ee3f21b3.js"><link rel="prefetch" href="/assets/js/18.2c35035c.js"><link rel="prefetch" href="/assets/js/19.e4881cfc.js"><link rel="prefetch" href="/assets/js/20.95040517.js"><link rel="prefetch" href="/assets/js/21.cdbb212e.js"><link rel="prefetch" href="/assets/js/22.7d278bc3.js"><link rel="prefetch" href="/assets/js/24.6cc55189.js"><link rel="prefetch" href="/assets/js/25.ea35ed40.js"><link rel="prefetch" href="/assets/js/26.2b97bfde.js"><link rel="prefetch" href="/assets/js/27.d323aa74.js"><link rel="prefetch" href="/assets/js/28.30416d07.js"><link rel="prefetch" href="/assets/js/29.02b97357.js"><link rel="prefetch" href="/assets/js/30.95aedede.js"><link rel="prefetch" href="/assets/js/31.79b824fd.js"><link rel="prefetch" href="/assets/js/32.d0cd6341.js"><link rel="prefetch" href="/assets/js/33.14c3c5b9.js"><link rel="prefetch" href="/assets/js/34.ac56f38e.js"><link rel="prefetch" href="/assets/js/35.54820345.js"><link rel="prefetch" href="/assets/js/36.37013d97.js"><link rel="prefetch" href="/assets/js/37.38353206.js"><link rel="prefetch" href="/assets/js/38.36296a20.js"><link rel="prefetch" href="/assets/js/39.37df68d6.js"><link rel="prefetch" href="/assets/js/4.54d65165.js"><link rel="prefetch" href="/assets/js/40.ffbd7a88.js"><link rel="prefetch" href="/assets/js/41.5db561d2.js"><link rel="prefetch" href="/assets/js/42.d876627b.js"><link rel="prefetch" href="/assets/js/43.e5008459.js"><link rel="prefetch" href="/assets/js/44.a24dc4a2.js"><link rel="prefetch" href="/assets/js/45.f696c4e1.js"><link rel="prefetch" href="/assets/js/8.8c0e5954.js"><link rel="prefetch" href="/assets/js/vendors~search.c4563fd1.js">
    <link rel="stylesheet" href="/assets/css/0.styles.948dbb0a.css">
  </head>
  <body>
    <div id="loader-wrapper" style="display: none;opacity:0">
      <div id="loader"></div>
      <div class="loader-section section-left"></div>
      <div class="loader-section section-right"></div>
    </div>
    <div id="app" data-server-rendered="true"><div style="height:100%;" data-v-80d5f2bc><section class="el-container main-container" data-v-80d5f2bc><aside class="el-aside menu" style="width:auto;" data-v-67e96130 data-v-80d5f2bc><ul role="menubar" class="menu-wrap el-menu" style="background-color:;" data-v-67e96130><li data-v-67e96130><div class="brand-wrap" style="background-image:url(/brand.jpg);" data-v-67e96130><div class="brand" data-v-67e96130><a href="/" class="avatar waves-effect waves-circle waves-light router-link-active" data-v-67e96130><img src="/avatar.jpg" data-v-67e96130></a> <hgroup class="introduce" data-v-67e96130><div class="nickname" data-v-67e96130>zzqhost</div> <a title="zzqhost@163.com" class="mail" data-v-67e96130>zzqhost@163.com</a></hgroup></div></div></li> <li role="menuitem" tabindex="-1" class="el-menu-item" style="padding-left:20px;color:;background-color:;" data-v-67e96130><i class="iconfont icon-home" data-v-67e96130></i> <span class="item-title" data-v-67e96130>主页</span></li> <li role="menuitem" tabindex="-1" class="el-menu-item" style="padding-left:20px;color:;background-color:;" data-v-67e96130><i class="iconfont icon-biaoqian" data-v-67e96130></i> <span class="item-title" data-v-67e96130>标签分类</span></li> <li role="menuitem" tabindex="-1" class="el-menu-item" style="padding-left:20px;color:;background-color:;" data-v-67e96130><i class="iconfont icon-wenzhang" data-v-67e96130></i> <span class="item-title" data-v-67e96130>时间归档</span></li> <!----> <li role="menuitem" tabindex="-1" class="el-menu-item" style="padding-left:20px;color:;background-color:;" data-v-67e96130><i class="iconfont icon-aboutme" data-v-67e96130></i> <span class="item-title" data-v-67e96130>自我介绍</span></li></ul></aside> <section class="el-container container-warp" data-v-80d5f2bc><header id="topHeader" class="el-header top-header" style="height:60px;padding-left:260px;" data-v-1a942948 data-v-80d5f2bc><div class="header-warp el-row is-align-middle el-row--flex" data-v-1a942948><div class="el-col el-col-12 el-col-xs-7" data-v-1a942948><div class="el-row is-align-middle el-row--flex" data-v-1a942948><div class="el-col el-col-2" data-v-1a942948><button type="button" class="el-button el-button--primary is-circle" data-v-1a942948><!----><!----><span><i class="iconfont icon-caidan" data-v-1a942948></i></span></button></div></div></div> <div class="el-col el-col-20 el-col-xs-24" data-v-1a942948><div class="grid-content bg-purple-light" data-v-1a942948><div class="el-row is-justify-end is-align-middle el-row--flex" data-v-1a942948><div class="el-col el-col-13 el-col-xs-24 el-col-sm-21 el-col-md-17 el-col-lg-13" data-v-1a942948><div aria-haspopup="listbox" role="combobox" aria-owns="el-autocomplete-6688" class="el-autocomplete search-input" data-v-1a942948><div class="el-input el-input--small el-input--suffix"><!----><input type="text" autocomplete="off" valueKey="value" popperClass="search-popper" placeholder="搜搜看" fetchSuggestions="function () { [native code] }" debounce="300" placement="bottom-start" popperAppendToBody="true" value="" class="el-input__inner"><!----><span class="el-input__suffix"><span class="el-input__suffix-inner"><i class="el-input__icon el-icon-search search-ico" data-v-1a942948></i><!----></span><!----></span><!----></div><div role="region" class="el-autocomplete-suggestion el-popper search-popper" style="width:;display:none;"><div class="el-scrollbar"><div class="el-autocomplete-suggestion__wrap el-scrollbar__wrap el-scrollbar__wrap--hidden-default"><ul class="el-scrollbar__view el-autocomplete-suggestion__list"></ul></div><div class="el-scrollbar__bar is-horizontal"><div class="el-scrollbar__thumb" style="width:0;transform:translateX(0%);ms-transform:translateX(0%);webkit-transform:translateX(0%);"></div></div><div class="el-scrollbar__bar is-vertical"><div class="el-scrollbar__thumb" style="height:0;transform:translateY(0%);ms-transform:translateY(0%);webkit-transform:translateY(0%);"></div></div></div></div></div></div></div></div></div></div></header> <main class="el-main my-main" style="margin-left:240px;" data-v-105de776 data-v-80d5f2bc><div class="content-header index-header" data-v-60d87e45 data-v-105de776><div class="container fade-scale in" data-v-60d87e45><h1 id="conentHeader" class="title" data-v-60d87e45>Android打渠道包方案总结</h1> <h5 class="subtitle" data-v-60d87e45>最后更新时间：2019-07-04 18:08:36</h5></div></div> <div data-v-95d4b5b2 data-v-105de776 data-v-105de776><div class="post-content el-row is-justify-center el-row--flex" data-v-95d4b5b2><div id="post-card" class="post-card post-sign el-col el-col-16 el-col-xs-24 el-col-sm-23 el-col-md-23 el-col-lg-16" data-v-95d4b5b2><div class="content__default" data-v-95d4b5b2><p>本篇是上一篇{% post_link Android签名原理剖析 %}的续章，主要总结了目前国内市面上Android应用的多种打渠道包的方案，并对新推出的Apk signature Scheme V2签名方案下的签名也进行了分析和总结
</p> <h1 id="android打渠道包方案的分类"><a href="#android打渠道包方案的分类" aria-hidden="true" class="header-anchor">#</a> Android打渠道包方案的分类</h1> <p>按照<strong>是否需要保护渠道号</strong>来划分的话，可以把目前市面上的打渠道包的方案方案分成以下两个类别</p> <ul><li>保护渠道号
<ul><li><strong>优点：</strong> 渠道号是受保护的，apk发出后，不会被第三方进行恶意修改渠道号</li> <li><strong>缺点：</strong> 由于渠道号文件，或者存放渠道号的文件需要进行签名，所以打包速度不可能太快</li> <li>方案
<ul><li>将渠道信息hard code在代码中或manifest文件中</li> <li>项目内放置渠道文件，然后代码中读取该文件来识别渠道</li> <li>android studio的productFlavors方案</li></ul></li></ul></li> <li>不保护渠道号
<ul><li><strong>优点：</strong> 渠道号是不受保护的，所以可以采用一些特殊的打包方案，进行快速打包，而不必重新签名</li> <li><strong>缺点：</strong> 可能会被第三方进行恶意修改渠道号</li> <li>方案
<ul><li>美团META-INF方式打包方案</li> <li>添加zip注释方式打包方案</li> <li>美团Walle（V2多渠道打包方案）</li></ul></li></ul></li></ul> <h1 id="apk-signature-scheme-v2"><a href="#apk-signature-scheme-v2" aria-hidden="true" class="header-anchor">#</a> APK Signature Scheme v2</h1> <p>在介绍各种打渠道包的方案前，先说说<strong>APK Signature Scheme v2</strong></p> <ul><li>V1是jar Signature，来自JDK；Android 7.0中引入了APK Signature Scheme v2</li> <li><strong>V1：</strong> 是对ZIP条目进行验证，这样APK签名后可进行许多修改 - 可以移动甚至重新压缩文件。</li> <li><strong>V2：</strong> 验证压缩文件的所有字节，而不是单个ZIP条目，因此，在签名后无法再更改(包括 zipalign)。正因如此，现在在编译过程中，我们将<strong>压缩、调整和签署合并成一步完成</strong>。好处显而易见，更安全而且新的签名可缩短在设备上进行验证的时间（不需要费时地解压缩然后验证），从而加快应用安装速度。</li> <li>引入V2后，签名可选用以下几种方案
<ol><li><strong>只使用v1签名</strong>：并不会影响什么，但是在7.0上不会使用更安全的验证方式</li> <li><strong>只使用V2签名</strong>: 7.0以下会直接安装完显示未安装，7.0以上则使用了V2的方式验证</li> <li><strong>同时使用V1和V2</strong>: 所有机型都没问题。 在Android studio打签名包时默认使用的就是这种方式</li></ol></li> <li>跟V2一同被google引入的还有SHA-256算法
<ol><li>它比SHA-1更加安全</li> <li>但是有一个缺点是：对于Android4.2以前的机器可能会有一些兼容性问题，可以参考{% post_link Android签名原理剖析 %}</li></ol></li></ul> <h1 id="方案分析"><a href="#方案分析" aria-hidden="true" class="header-anchor">#</a> 方案分析</h1> <ol><li>渠道信息hard code在代码中或manifest文件中
<ul><li>需要修改源文件，并编译打包，效率较低</li> <li>这种方案可以使用于V1和V2两种签名方式中</li></ul></li> <li>项目内放置渠道文件，然后代码中读取该文件来识别渠道
<ul><li>比较笨的做法是修改源码中的配置文件，编译打包</li> <li>优化一点的方案是先打好一个包，然后其它的渠道包通过解压、修改、再压缩签名的方式</li> <li>不管是笨的做法还是优化一点的方案都可以使用在V1和V2两种签名方式中</li></ul></li> <li>android studio的productFlavors方案，<a href="http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Product-flavors" target="_blank" rel="noopener noreferrer">google说明<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a> <ul><li>android studio自带的多渠道打包方案，功能非常强大，不仅仅是识别渠道信息，还能使用不同的源代码、资源等几乎所有不同渠道的打包需求</li> <li>但这种方式同样需要每个渠道都重新编译打包，对于只需要标记不同渠道信息的项目而言耗时太多</li> <li>一个优化的点：可以在打渠道包前，替换一下包含productFlavors的build.gradle，这样可同时出多个渠道包；而平常开发过程中使用不带productFlavors的build.gradle, 这样就避免了给所有的开发同学暴露渠道信息了。</li> <li>此种方法依然适用于V1和V2方案</li></ul></li> <li>META-INF方式
<ul><li>这是美团早期出的一种方案，可<a href="http://tech.meituan.com/mt-apk-packaging.html" title="美团Android自动化之旅—生成渠道包" target="_blank" rel="noopener noreferrer">参考<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li> <li>利用android签名不校验META-INF文件夹内容的漏洞，在此文件夹内放置渠道信息文件将不受签名限制</li> <li>打包签名一个无渠道信息的apk完成后，复制此apk并将不同渠道信息文件分别插入新生成的apk文件中，从而实现各渠道打包</li> <li>特点是：直接使用已有的apk，解压放入渠道文件，再压缩，不用再签名。所以这种方式速度非常快，900个渠道包用时不到一分钟</li> <li>只适用于V1签名方式，不适用于V2</li></ul></li> <li>添加zip注释方式
<ul><li><a href="https://github.com/mcxiaoke/packer-ng-plugin" title="添加zip注释方式" target="_blank" rel="noopener noreferrer">参考<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li> <li>利用android签名不校验zip文件注释信息的漏洞，apk本质是一个zip包，将渠道信息写入zip文件注释内将不受签名限制</li> <li>打包签名一个无渠道信息的apk完成后，复制此apk并将不同渠道信息字符串分别写入新生成的apk文件</li> <li>这种方式生成渠道包的速度也很快：100个渠道包只需10秒</li> <li>只适用于V1，不适用于V2</li></ul></li> <li>美团Walle
<ul><li><a href="https://github.com/Meituan-Dianping/walle" title="美团Walle" target="_blank" rel="noopener noreferrer">参考<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li> <li>是专门针对<strong>V2增强版签名</strong>的一种多渠道打包方案</li> <li>利用V2签名的校验方式不校验APK Signing Block并且忽略APK Signing Block中多余的ID-VALUE这个特点，将渠道信息写到APK Signing Block中。</li> <li>由于是直接对zip格式文件的操作，性能与添加zip注释方式相当，也是很快</li> <li>只适用于V2</li></ul></li></ol> <h1 id="总结"><a href="#总结" aria-hidden="true" class="header-anchor">#</a> 总结</h1> <p>通过下表总结一下这几种打渠道包的方案</p> <table><thead><tr><th>方案</th> <th>是否安全</th> <th>速度</th> <th>是否适用于V2</th></tr></thead> <tbody><tr><td>渠道信息hard code在代码中或manifest文件中</td> <td>是</td> <td>慢</td> <td>适用</td></tr> <tr><td>项目内放置渠道文件，然后代码中读取该文件来识别渠道</td> <td>是</td> <td>慢</td> <td>适用</td></tr> <tr><td>productFlavors</td> <td>是</td> <td>慢</td> <td>适用</td></tr> <tr><td>META-INF方式</td> <td>否</td> <td>快</td> <td>不适用</td></tr> <tr><td>添加zip注释方式</td> <td>否</td> <td>快</td> <td>不适用</td></tr> <tr><td>美团Walle</td> <td>否</td> <td>快</td> <td>适用</td></tr></tbody></table> <p>由此可见</p> <ul><li>安全和速度是成反比的，要想安全，打包速度就快不了，否则就不安全。其实想一想也就明白原因了</li> <li>打包快的方案，都是利用一些漏洞或特征来做的</li> <li>目前的三种快速打包方案，只有walle适用于V2，其余的两种都已经不适用了</li> <li>大家可以根据自己公司的需求，来决定采用哪种方案。 是速度还是安全？</li></ul> <h1 id="参考"><a href="#参考" aria-hidden="true" class="header-anchor">#</a> 参考</h1> <ul><li>{% post_link Android签名原理剖析 %}</li> <li><a href="http://www.cnblogs.com/jeffen/p/6824722.html" target="_blank" rel="noopener noreferrer">Android Studio 打包时 Signature Version 选择 V1 V2 说明<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li> <li><a href="http://blog.csdn.net/cdecde111/article/details/55506311" target="_blank" rel="noopener noreferrer">android多渠道打包方案总结及APK signature scheme v2兼容<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li> <li><a href="http://tech.meituan.com/mt-apk-packaging.html" title="美团Android自动化之旅—生成渠道包" target="_blank" rel="noopener noreferrer">美团Android自动化之旅—生成渠道包<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li> <li><a href="https://github.com/mcxiaoke/packer-ng-plugin" title="添加zip注释方式" target="_blank" rel="noopener noreferrer">添加zip注释方式<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li> <li><a href="https://github.com/Meituan-Dianping/walle" title="美团Walle" target="_blank" rel="noopener noreferrer">美团Walle<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li></ul></div> <span id="footerPost" data-v-95d4b5b2></span></div> <div id="post-toc" class="post-toc el-col el-col-6" data-v-95d4b5b2><h4 class="catalog-title" data-v-95d4b5b2>TOC</h4> <div class="catalog-body" data-v-95d4b5b2><ul id="catalog-list" class="catalog-list" data-v-95d4b5b2></ul></div></div></div> <div class="post-nav el-row is-justify-space-around el-row--flex" data-v-95d4b5b2><div class="post-prev el-col el-col-7" data-v-95d4b5b2><div data-v-95d4b5b2><a href="/posts/Retrofit2%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.html" data-v-95d4b5b2><i class="el-icon-arrow-left" data-v-95d4b5b2></i> Prev
        </a> <p class="nav-title" data-v-95d4b5b2>Retrofit2学习笔记</p></div></div> <div class="post-next el-col el-col-7 el-col-lg-pull-5" data-v-95d4b5b2><div data-v-95d4b5b2><a href="/posts/Android%E7%AD%BE%E5%90%8D%E5%8E%9F%E7%90%86%E5%89%96%E6%9E%90.html" data-v-95d4b5b2>
          Next
          <i class="el-icon-arrow-right" data-v-95d4b5b2></i></a> <p class="nav-title" data-v-95d4b5b2>Android签名剖析</p></div></div></div> <div class="el-row is-justify-center el-row--flex" data-v-95d4b5b2></div> <span data-v-d999c3f2 data-v-95d4b5b2><button type="button" class="el-button toc-btn el-button--primary is-circle" data-v-d999c3f2><!----><!----><span><i class="iconfont icon-service-directory" data-v-d999c3f2></i></span></button> <button type="button" class="el-button gotop-btn el-button--primary is-circle" data-v-d999c3f2><!----><!----><span><i class="el-icon-arrow-up" data-v-d999c3f2></i></span></button></span></div></main></section> <button type="button" class="el-button gotop-btn el-button--primary is-circle" style="display:none;" data-v-78a2dcfa data-v-80d5f2bc><!----><!----><span><i class="el-icon-arrow-up" data-v-78a2dcfa></i></span></button></section> <footer class="el-footer container-footer" style="height:60px;" data-v-76c50ee3 data-v-80d5f2bc><div class="footer-warp el-row is-justify-center is-align-center el-row--flex footerMargin" data-v-76c50ee3><div class="footer-top el-col el-col-24" data-v-76c50ee3><p class="ellipsis" data-v-76c50ee3><span data-v-76c50ee3>
          博客内容遵循
          <a rel="license" href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh" data-v-76c50ee3>知识共享 署名 - 非商业性 - 相同方式共享 4.0 国际协议</a></span></p></div> <div class="footer-bottom el-col el-col-24" data-v-76c50ee3><p class="ellipsis" data-v-76c50ee3><span data-v-76c50ee3><span data-v-76c50ee3>
            张志强的博客 © 2017-01 ~ 2021-03
          </span></span> <span data-v-76c50ee3>
          Power by
          <a href="https://vuepress.vuejs.org/zh/" target="_blank" data-v-76c50ee3>VuePress</a> Theme
          <a href="https://github.com/zhhlwd/vuepress-theme-indigo-material" target="_blank" data-v-76c50ee3>indigo material</a></span></p></div></div></footer> <div class="overlay" data-v-80d5f2bc></div></div><div class="global-ui"></div></div>
    <script src="/assets/js/app.3e01f5cb.js" defer></script><script src="/assets/js/1.21aaee9f.js" defer></script><script src="/assets/js/14.98a4de9c.js" defer></script><script src="/assets/js/5.352c1a43.js" defer></script><script src="/assets/js/7.4a8a313c.js" defer></script><script src="/assets/js/9.5ce2172b.js" defer></script><script src="/assets/js/6.8b8fad13.js" defer></script><script src="/assets/js/23.1e2b813e.js" defer></script><script src="/assets/js/13.186562af.js" defer></script><script src="/assets/js/15.740f4afc.js" defer></script>
  </body>
</html>
